/*===============================================
*   文件名称：tcp_client.c
*   创 建 者：     
*   创建日期：2024年09月18日
*   描    述：
================================================*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{ 
    if(argc < 3){
        printf("Usage:%s <IP> <PORT>\n", argv[0]);
        return -1;
    }

    int sfd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == sfd){
        perror("socket");
        return -1;
    }

    struct sockaddr_in saddr;
    saddr.sin_family      = AF_INET;
    saddr.sin_port        = htons( atoi(argv[2]) );
    saddr.sin_addr.s_addr = inet_addr(argv[1]);

    if(-1 == connect(sfd, (void *)&saddr, sizeof saddr)){
        perror("connect");
        return -1;
    }

    char buf[1024],pic_len[5];
    int ret, len, count;
    int fd = open("1.png", O_WRONLY|O_CREAT, 0777);
    if(-1 == fd){
        perror("open");
        return -1;
    }
    while(1){
        ret = read(sfd, pic_len, 5);
        if(-1 == ret){
            perror("read");
            return -1;
        }else if(0 == ret){
            break;
        }
        len = atoi(pic_len);
        if(0 == len){
            break;
        }
        //read(sfd, buf, len);
        count = 0; //记录已读字节数
        //循环接收数据,保证数据的完整性
        while(count < len){
            //buf+count的偏移目的是避免覆盖上一次收到的数据
            ret = read(sfd, buf+count, len-count);
            count += ret;  //更新已读字节数
        }
        write(fd, buf, len);
    }

    return 0;
} 
